/**
 * 消息状态定义
 */
export const MessageStatus = {
  CREATING: 0,      // 创建中（前端尚未显示）
  PENDING: 1,       // 待确认（显示"发送中"或转圈圈）
  SENT: 2,          // 已发送（官方响应已收到）
  DELIVERED: 3,     // 已送达（对方已收到）
  READ: 4,          // 已读（对方已读）
  RECALLED: 5,      // 已撤回
  FAILED: 6         // 发送失败
}

/**
 * 消息事件类型
 */
export const MessageEvent = {
  CREATED: 'message_created',      // 消息已创建（后端记录已保存）
  CONFIRMED: 'message_confirmed',  // 消息已确认（官方响应已收到）
  DELIVERED: 'message_delivered',  // 消息已送达
  READ: 'message_read',            // 消息已读
  RECALLED: 'message_recalled',    // 消息已撤回
  FAILED: 'message_failed'         // 消息发送失败
}

/**
 * 生成临时消息ID（前端生成）
 * 格式：timestamp-random
 */
export function generateTempId() {
  const timestamp = Date.now()
  const random = Math.floor(Math.random() * 1000000)
  return `${timestamp}-${random}`
}

/**
 * 生成 mid（用于匹配官方响应）
 * 格式：与闲鱼官方格式一致
 */
export function generateMid() {
  const timestamp = Date.now()
  const random = Math.floor(Math.random() * 10000)
  return `${timestamp}${random} 0`
}

/**
 * 判断状态是否可以转换
 */
export function canTransition(currentStatus, newStatus) {
  // RECALLED 和 FAILED 是终态，不能再转换
  if (currentStatus === MessageStatus.RECALLED || currentStatus === MessageStatus.FAILED) {
    return false
  }
  
  // 任何状态都可以转为 RECALLED 或 FAILED
  if (newStatus === MessageStatus.RECALLED || newStatus === MessageStatus.FAILED) {
    return true
  }
  
  // 不允许状态倒退（除非是时序错乱的情况）
  // 例如：SENT 不能退回 PENDING
  if (newStatus < currentStatus) {
    console.warn('[MessageStatus] 状态倒退（可能是时序错乱）:', {
      current: currentStatus,
      new: newStatus
    })
    return false
  }
  
  return true
}

/**
 * 获取状态显示文本
 */
export function getStatusText(status) {
  switch (status) {
    case MessageStatus.CREATING:
      return '创建中'
    case MessageStatus.PENDING:
      return '发送中'
    case MessageStatus.SENT:
      return '已发送'
    case MessageStatus.DELIVERED:
      return '已送达'
    case MessageStatus.READ:
      return '已读'
    case MessageStatus.RECALLED:
      return '已撤回'
    case MessageStatus.FAILED:
      return '发送失败'
    default:
      return ''
  }
}

